/**
 * @author 王晓伟
 * @version 0.11
 * @class Ext.ux.PanelForm 扩展了一个EXT的Ext.form.FormPanel,提供了Ext.Window的常用功能。
 * 表单中默认的子组件为textfield,左对齐，子组件的默认布局为锚定90%。
 * 定义了submitsuccess、submitfailure两个自定义事件，表单提交成功触发submitsuccess事件，提交结果失败触发submitfailure
 * 向EXT系统注册的组件xtype是uxPanelForm
 * @config 配置参数是一个JSON对象{object}
 * @extends Ext.form.FormPanel
 */
Ext.ux.PanelForm = Ext.extend(Ext.form.FormPanel,{
		anchor:'100% 100%',
		frame:true,
		resizable:false,
		labelWidth:60,
		labelAlign:'left',
		defaultType:'textfield',	
		/**
		 * 是否表单提交成功后用Ext.msg组件显示后台返回的提示信息。
		 * @type Boolean
		 */
		isDisplaySuccessMsg:true,
		/**
		 * 是否表单提交失败后用Ext.msg组件显示后台返回的提示信息。
		 * @type Boolean
		 */
		isDisplayFailureMsg:true,
		/*defaults:{
			anchor:'90%'
		},*/
		formname:null,
		showButtons:false,
		leftbuttontext:'提交',
		rightbuttontext:'取消',
		url:'',
	initComponent:function() {
		if(this.showButtons){
			this.buttons = [{
				xtype : 'button',
				text  : this.leftbuttontext,
				handler : function(b,e){
					var _form = this.findParentBy(function(p){
						if(p.getXType() == 'uxPanelForm' ){
							return true;
						}
					});
					_form.fireEvent('submitforms',_form);	
				}
			},{
				xtype : 'button',
				text  : this.rightbuttontext,
				handler : function(b,e){
					var _form = this.findParentBy(function(p){
						if(p.getXType() == 'uxPanelForm' ){
							return true;
						}
					});
					_form.fireEvent('resetforms',_form);		
				}
			}] 
		};
		Ext.ux.PanelForm.superclass.initComponent.call(this);
		
		this.addEvents(
		/**
		 * @event 表单提交成功事件
		 * @param 当前表单（PanelForm）
		 * @param 当前表单的BasicForm
		 */
		'submitsuccess',
		/**
		 * @event 表单提交失败事件
		 * @param 当前表单（PanelForm）
		 * @param 当前表单的BasicForm
		 */
		'submitfailure',
		/**
		 * 定义一个设计状态下选中事件,这个事件的触发条件是一旦PanelForm组件在设计状态下被选中后就触发这个事件
		 * _PanelForm(组件名称)
		 */
		'designSelected',
		/**
		 * 定义一个表单提交事件
		 * _PanelForm(组件名称)
		 */
		'submitforms',
		/**
		 * 定义一个表单重置事件
		 * _PanelForm(组件名称)
		 */
		'resetforms'
		);
		this.on('render',function(p) {
			    if(this.resizable){
			        	new Ext.Resizable(p.getEl(), {
			                handles: 'all',
			                pinned: true,
			                transparent: true,
			                resizeElement: function() {
			                    var box = this.proxy.getBox();
			                    p.updateBox(box);
			                    if (p.layout) {
			                        p.doLayout();
			                    }
			                    return box;
			                }
			           });
			           $('#'+this.id).bind('click',{components:this},function(event){
							if(event.target.nodeName == 'FORM'){
								event.data.components.fireEvent('designSelected',event.data.components);
							}	
							
						});
			       }						       
			}
		);
	},
	/**
	 * @method
	 * 表单提交方法，调用这个方法可以触发表单以AJAX方式提交。
	 * 注意：应设置相应的URL。并且应当定义submitsuccess，submitfailure这两个事件的
	 * 回调函数以对相应的事件进行处理。
	 * 例如：
	 * _panel.on('submitsuccess',function(){
		_win.close();
		});
		_panel.on('submitfailure',function(){
			_panel.textfieldselected();
		});
	 * 
	 * 
	 * 
	 */
	formsubmit:function(){
		var _formpanel = this;
		if(_formpanel.isValid()){
			_formpanel.getForm().submit({
				url : this.url,
				waitMsg : Ext.waitMsg,
				waitTitle  : Ext.waitTitle,
				success : function(_form,_action){
					if(_formpanel.isDisplaySuccessMsg){
						Ext.Msg.alert(Ext.definetitle,_action.result.msg,function(){
							_formpanel.fireEvent('submitsuccess',_formpanel,this);
						});	
					}else{
						_formpanel.fireEvent('submitsuccess',_formpanel,this);
					}
				},
				failure : function(_form,_action){
					if(_formpanel.isDisplayFailureMsg){
						Ext.Msg.alert(Ext.definetitle,_action.result.msg,function(){
							_formpanel.fireEvent('submitfailure',_formpanel,this);
						});
					}else{
						_formpanel.fireEvent('submitfailure',_formpanel,this);
					}
				}
			});	
		}
	},
	/**
	 * @method 表单数据重置数据方法
	 */
	formreset:function(){
		this.getForm().reset();
	},
	/**
	 * @method 选中表单的第一个文本框中的文字
	 */
	textfieldselected:function(){
		var _array =  this.findByType('textfield');
		if(_array.length > 0){
			_array[0].selectText();
		}
	},
	/**
	 * @method 表单的第一个文本框获得焦点
	 */
	textfieldfocus:function(){
		var _array =  this.findByType('textfield');
		if(_array.length > 0){
			_array[0].focus();
		}
	},
	/**
	 * 向表单填充数据
	 * @param {Record} 一个record对象
	 */
	setFormData:function(_record){
		this.getForm().loadRecord(_record);
	},
	/**
	 * 表单验证
	 * return boolean
	 */
	isValid:function(){
		return this.getForm().isValid();
	},
	/**
	 * 以JSON方式返回表单中的数据
	 * @return {JSON}
	 */
	getValues:function(){
		return this.getForm().getValues();
	},
	/**
	 * 以JSON方式向表单填充数据
	 * @return {JSON}
	 */
	setValues:function(_o){
		 this.getForm().setValues(_o);
	}
});
Ext.reg('uxPanelForm',Ext.ux.PanelForm);